package 晚间作业0323;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 已知一个文本内容如下：
 * name:xiaoming,age:10岁,gender:male,height:172cm,weight:70kg
 * age:20岁,height:177cm,name:xiaobai,weight:80kg,gender:male
 * gender:female,height:176cm,weight:66kg,name:xiaolv,age:21岁
 * 每一行是数据为一个人的信息，但是顺序是不固定的。
 * 1.读取这些数据，每一行的数据封装到一个 Person 对象中，并存入一个 List 集合
 * 2.删除集合中所有的未成年的数据
 * 3.计算所有人的平均年龄、最大年龄、最小年龄
 * 4.将集合中的数据按照年龄进行降序排序，若年龄相同，按照身高降序排序
 * 5.查询集合中所有的年龄在[20, 25]范围内，体重在[60, 80]范围内的数据，按照身高降序排列，截取第4名到第8名。
 */
public class Doc15_实战案例一 {
    public static void main(String[] args) {
        String data = "name:xiaoming,age:10岁,gender:male,height:172cm,weight:70kg\n" +
                "age:20岁,height:177cm,name:xiaobai,weight:80kg,gender:male\n" +
                "gender:female,height:176cm,weight:66kg,name:xiaolv,age:21岁";
        String[] persons = data.split("\\n");
        // 1.读取这些数据，每一行的数据封装到一个 Person 对象中，并存入一个 List 集合
        List<Person> personList = new ArrayList<>(persons.length);
        for (String person : persons) {
            personList.add(Person.str2Person(person));
        }
        System.out.println("[1]==>" + personList);
        //2.删除集合中所有的未成年的数据
        personList.removeIf(item -> item.age < 18);
        System.out.println("[2]==>" + personList);
        //3.计算所有人的平均年龄、最大年龄、最小年龄
        int max = personList.get(0).age, min = max, sum = max;
        int len = personList.size();
        Person item;
        for (int i = 1; i < len; i++) {
            item = personList.get(i);
            if (item.age > max) {
                max = item.age;
            }
            if (item.age < min) {
                min = item.age;
            }
            sum += item.age;
        }
        System.out.printf(Locale.CHINA, "平均年龄：%.2f, 最大年龄: %d, 最小年龄: %d%n", (double) sum / len, max, min);
        // 4.将集合中的数据按照年龄进行降序排序，若年龄相同，按照身高降序排序
        personList.sort((o1, o2) -> o1.age == o2.age ? o2.height - o1.height : o2.age - o1.age);
        System.out.println("[4]==>" + personList);
        // 5.查询集合中所有的年龄在[20, 25]范围内，体重在[60, 80]范围内的数据，按照身高降序排列，截取第4名到第8名。
        List<Person> subPersonList = personList.stream()
                .filter(p -> p.age >= 20 && p.age <= 25 && p.weight >= 60 && p.weight <= 80)
                .collect(Collectors.toList());
//                .subList(3, 8);
        System.out.println("[5]==>" + subPersonList);
    }


    public static class Person {
        private String name;
        private String gender;
        private int age;
        private int height;
        private int weight;

        public Person(String name, String gender, int age, int height, int weight) {
            this.name = name;
            this.age = age;
            this.gender = gender;
            this.height = height;
            this.weight = weight;
        }

        public static Person str2Person(String pInfoStr) {
            String[] split = pInfoStr.split(",");
            Map<String, String> pInfo = new HashMap<>(split.length);
            for (String s : split) {
                String[] item = s.split(":");
                pInfo.put(item[0], item[1]);
            }
            return new Person(pInfo.get("name") , pInfo.get("gender"),
                    Integer.parseInt(pInfo.get("age").replace("岁", "")),
                    Integer.parseInt(pInfo.get("height").replace("cm", "")),
                    Integer.parseInt(pInfo.get("weight").replace("kg", "")));
        }

        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", gender='" + gender + '\'' +
                    ", age=" + age +
                    ", height=" + height +
                    ", weight=" + weight +
                    '}';
        }
    }
}
